import GlobalData from './GlobalData'

export class HttpClient {
  private baseUrl:string;
  constructor (baseUrl:string) {
    this.baseUrl = baseUrl
    // 增加拦截器
    Megalo.request.interceptors.before.use(options => {
      options.url = this.baseUrl + options.url
      options.data = options.data || {}
      options.header = options.header || {}
      if (options.method !== 'GET' && !options.header['content-type']) { options.header['content-type'] = 'application/json-patch+json' }
      options.header['Accept-Language'] = 'zh-CN,zh;q=0.9,en;q=0.8'
      options.header['Authorization'] = 'Bearer ' + GlobalData.token

      return options
    }, err => {
      return Promise.reject(err)
    })

    Megalo.request.interceptors.after.use(response => {
      if (response.data.error) {
        // {"error":{"code":null,"message":"xxx!","details":null,"validationErrors":null}}
        Megalo.showToast({ title: response.data.error.message, icon: 'none', duration: 1000, mask: false })
        console.log('NetDataError:' + response.data.error)
        return Promise.reject(response.data.error)
      }
      return response.data
    }, err => {
      console.log('NetError:' + err)
      return Promise.reject(err)
    })
  }

  public async request (options?: {
    /** 开发者服务器接口地址 url */
    url: string,
    /** 请求的参数 */
    data?: object|string|any[],
    /** 设置请求的 header，header 中不能设置 Referer。content-type 默认为 application/json */
    header?: object,
    /** （需大写）有效值：OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */
    method?: string,
    /** 返回的数据格式 */
    dataType?: string,
    /** 响应的数据类型（支付宝不支持） */
    responseType?: string,
    /** 接口调用成功的回调函数 */
    success?(data?),
    /** 接口调用失败的回调函数 */
    fail?(err?),
    /** 接口调用结束的回调函数（调用成功、失败都会执行 */
    complete?(),
  }) {
    return Megalo.request(options)
  }

  public async get (options?: {
    /** 开发者服务器接口地址 url */
    url: string,
    /** 请求的参数 */
    data?: object|string|any[],
    /** 设置请求的 header，header 中不能设置 Referer。content-type 默认为 application/json */
    header?: object,
    /** （需大写）有效值：OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */
    method?: string,
    /** 返回的数据格式 */
    dataType?: string,
    /** 响应的数据类型（支付宝不支持） */
    responseType?: string,
    /** 接口调用成功的回调函数 */
    success?(data?),
    /** 接口调用失败的回调函数 */
    fail?(err?),
    /** 接口调用结束的回调函数（调用成功、失败都会执行 */
    complete?(),
  }) {
    options!.method = 'GET'
    return Megalo.request(options)
  }

  public async post (options?: {
    /** 开发者服务器接口地址 url */
    url: string,
    /** 请求的参数 */
    data?: object|string|any[],
    /** 设置请求的 header，header 中不能设置 Referer。content-type 默认为 application/json */
    header?: object,
    /** （需大写）有效值：OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */
    method?: string,
    /** 返回的数据格式 */
    dataType?: string,
    /** 响应的数据类型（支付宝不支持） */
    responseType?: string,
    /** 接口调用成功的回调函数 */
    success?(data?),
    /** 接口调用失败的回调函数 */
    fail?(err?),
    /** 接口调用结束的回调函数（调用成功、失败都会执行 */
    complete?(),
  }) {
    options!.method = 'POST'
    return Megalo.request(options)
  }
  public async put (options?: {
    /** 开发者服务器接口地址 url */
    url: string,
    /** 请求的参数 */
    data?: object|string|any[],
    /** 设置请求的 header，header 中不能设置 Referer。content-type 默认为 application/json */
    header?: object,
    /** （需大写）有效值：OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */
    method?: string,
    /** 返回的数据格式 */
    dataType?: string,
    /** 响应的数据类型（支付宝不支持） */
    responseType?: string,
    /** 接口调用成功的回调函数 */
    success?(data?),
    /** 接口调用失败的回调函数 */
    fail?(err?),
    /** 接口调用结束的回调函数（调用成功、失败都会执行 */
    complete?(),
  }) {
    options!.method = 'PUT'
    return Megalo.request(options)
  }

  public async delete (options?: {
    /** 开发者服务器接口地址 url */
    url: string,
    /** 请求的参数 */
    data?: object|string|any[],
    /** 设置请求的 header，header 中不能设置 Referer。content-type 默认为 application/json */
    header?: object,
    /** （需大写）有效值：OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT */
    method?: string,
    /** 返回的数据格式 */
    dataType?: string,
    /** 响应的数据类型（支付宝不支持） */
    responseType?: string,
    /** 接口调用成功的回调函数 */
    success?(data?),
    /** 接口调用失败的回调函数 */
    fail?(err?),
    /** 接口调用结束的回调函数（调用成功、失败都会执行 */
    complete?(),
  }) {
    options!.method = 'DELETE'
    return Megalo.request(options)
  }
}

export default new HttpClient(process.env.VUE_APP_HOST)
